﻿/*----------------------------------------------------------------
// 公司名称：公司名称
// 
// 产品名称：Gaf
//
// 创 建 人：netcasewqs
// 创建日期：2022/3/4
// 邮    箱：netcasewqs@qq.com
//
// Copyright (C) 2022 Gaf，保留所有权利。
//
//----------------------------------------------------------------*/

namespace Gaf;

/// <summary>
/// 冗余DLL文件检查器
/// </summary>
static class RedundantDllFileChecker
{
    /// <summary>
    /// 冗余检查
    /// </summary>
    public static void RedundantCheck()
    {
        var result = GetRepeatDllFiles(AppDomain.CurrentDomain.BaseDirectory);
        if (result.Count > 0)
        {
            string tip = "检测到一个或多个冗余的Dll文件，请确认！\r\n";

            foreach (var item in result)
            {
                tip += string.Format("\r\n{0}\r\n", item.Key);

                int index = 1;
                foreach (var item1 in item.Value)
                {
                    tip += string.Format("位置{0}：{1}\r\n", index++, item1);
                }
            }

            throw new SystemException(tip);
        }
    }

    /// <summary>
    /// 获取相同文件名且尺寸相等的DLL文件。
    /// </summary>
    /// <param name="path">搜索路径</param>
    /// <returns>以文件名为键，路径列表为值的字典</returns>
    public static IDictionary<string, IList<string>> GetRepeatDllFiles(string path)
    {
        var files = Directory.GetFiles(path, @"*.dll", SearchOption.AllDirectories);
        Dictionary<string, IList<string>> record = new();

        foreach (var item in files)
        {
            var key = Path.GetFileName(item);
            if (!record.ContainsKey(key))
            {
                record[key] = new List<string>();
            }

            record[key].Add(item);
        }

        // 获取文件名重复的文件
        bool done;
        do
        {
            done = true;
            foreach (var item in record)
            {
                if (item.Value.Count == 1)
                {
                    done = false;
                    record.Remove(item.Key);
                    break;
                }
            }
        } while (!done);

        // 获取大小重复的文件
        do
        {
            done = true;
            foreach (var item in record)
            {
                var dic = new Dictionary<long, IList<string>>();

                foreach (var file in item.Value)
                {
                    var fileInfo = new System.IO.FileInfo(file);

                    if (!dic.ContainsKey(fileInfo.Length))
                    {
                        dic[fileInfo.Length] = new List<string>();
                    }

                    dic[fileInfo.Length].Add(file);
                }

                bool isReapeat = false;
                foreach (var file in dic)
                {
                    if (file.Value.Count > 1)
                    {
                        isReapeat = true;
                        break;
                    }
                }

                if (!isReapeat)
                {
                    done = false;
                    record.Remove(item.Key);
                    break;
                }
            }
        } while (!done);

        return record;
    }

}
